import axios from 'axios'
import { useUserStore } from '../store/user'
import { ElMessage } from 'element-plus'
import router from '../router'

const service = axios.create({
  baseURL: 'http://localhost:8080',
  timeout: 9000
})
// 请求拦截器会在请求发送之前执行
// 根据后端TokenFilter过滤器的实现，登录请求不需要拦截，其他请求需要携带token
service.interceptors.request.use(
  (config) => {
    // 判断是否是登录请求，如果是登录请求则不需要添加token
    if (config.url.includes('login')) {
      console.log('登录请求，不需要添加token')
      return config
    }
    
    // 非登录请求，从localStorage获取用户信息
    // 添加空对象作为默认值，防止JSON.parse返回null导致错误
    let loginUser = JSON.parse(localStorage.getItem('loginUser') || '{}')
    
    // 安全地访问token，避免undefined错误
    if (loginUser && loginUser.token) {
      console.log('发送请求携带token:', loginUser.token)
      // 设置请求头中的token，与后端TokenFilter中获取的header名称保持一致
      config.headers.authorization = loginUser.token;
    } else {
      console.log('未找到token，请求可能会被拦截返回401')
      // 这里不阻止请求发送，让后端进行处理
    }
    return config
  }
)

// 响应拦截器
service.interceptors.response.use(
  (response) => { //成功回调
    // 直接返回响应数据
    return response.data
  },
  (error) => { //失败回调
    // 处理HTTP错误状态码
    if (error.response) {
      // 处理401未授权错误 - 与后端TokenFilter返回的401状态码对应
      if (error.response.status === 401) {
        // 清除登录信息
        localStorage.removeItem('loginUser')
        // 清除Pinia store中的用户信息
        const userStore = useUserStore()
        userStore.logout()
        
        // 显示友好的错误提示
        ElMessage.error('登录已过期或未登录，请重新登录')
        
        // 保存当前路径作为重定向参数，登录成功后可以跳回原页面
        const currentPath = router.currentRoute.value.fullPath
        // 如果当前已经是登录页，则不需要带redirect参数
        if (currentPath.includes('/login')) {
          router.push('/login')
        } else {
          router.push(`/login?redirect=${encodeURIComponent(currentPath)}`)
        }
      } else {
        // 处理其他HTTP错误
        const errorMsg = error.response.data?.message || `请求错误 (${error.response.status})`
        ElMessage.error(errorMsg)
      }
    } else if (error.request) {
      // 请求已发送但没有收到响应
      ElMessage.error('服务器无响应，请检查网络连接')
    } else {
      // 请求配置出错
      ElMessage.error(`请求错误: ${error.message}`)
    }
    return Promise.reject(error)
  }
)

export default service